#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>

#define LEFT "["
#define RIGHT "]"
#define LABLE "#"
#define LINE_SIZE 1024
#define ARGC_SIZE 32
int lastcode = 0;
extern char **environ;
char commandline[LINE_SIZE];
char* argv[ARGC_SIZE];



const char* getusername()
{
  return getenv("USER");
}

const char* gethostname()
{
  return getenv("HOSTNAME");
}
const char* getpwd()
{
  return getenv("PWD");
}


void Interact(char* cline, int size)
{
  
  printf(LEFT"%s@%s %s"RIGHT""LABLE, getusername(), gethostname(), getpwd());
  
  //scanf("%s", commandline);
  char* s = fgets(cline, size, stdin);
  (void)s;
  
  cline[strlen(cline)-1] = '\0';
}

int splitstring(char** argv, char* commandline)
{

    // 对 commandline 做分割处理
    int i = 0;
    argv[i++] = strtok(commandline, " \t");
    while(1)  // 切割好的字符串指针 放入 argv中，
    {
      argv[i] = strtok(NULL, " \t");
      if(argv[i]==NULL)
      {
        i++;
        break;
      }
      i++;
    }
    return i-1;
}

void NormalExcute(char* argv[])
{

    pid_t id = fork();
    if(id < 0)
    {
      perror("fork error");
      //continue;
      return;
    }
    else if(id == 0)
    {
      // 子进程
      execvpe(argv[0], argv, environ);
      exit(999);  // 进程替换出错必然 返回
    }
    else
    {
      // 父进程
      
      int status = 0;
      pid_t rid = waitpid(id, &status, 0);
      if(rid == id)
      {
        // 等待成功
        lastcode = WEXITSTATUS(status);
      }
    }
}



int main()
{
  // 1、


  //printf("sizeof commandline : %d\n", sizeof(commandline));
  while(1)
  {
    // 2、交互问题，获取命令行
    Interact(commandline, LINE_SIZE);
    
    // 3、子串分割的问题，解析命令行
    int argc = splitstring(argv, commandline); 
    if(argc == 0)
    {
      continue;
    }

    //for(int j = 0; j < argc; j++)
    //{
    //  printf("[%d] : %s\n", j, argv[j]);
    //}

    // 4、指令的判断  是否内建命令
    if(argc == 2 && strcmp(argv[0], "cd")==0)
    {
      chdir(argv[1]);
      if(strcmp(argv[1], ".") == 0) continue;
      else if(strcmp(argv[1], "..") == 0)  // 切割出上级目录？
      {
        
      }
      else{
        sprintf(getenv("PWD"), "%s", argv[1]);
      }
      continue;
    }




    // 5、普通命令的执行
    NormalExcute(argv);


  }
  
  
  
  
  printf("echo : %s", commandline);





  return 0;
}
